/*
 * FileReader.cpp
 *
 *  Created on: Jun 17, 2014
 *      Author: carlos
 */

#include "FileReader.h"

FileReader::FileReader(string path, bool compressMode) :
		compressMode(compressMode) {
	this->buffered = false;
	this->path = path;
	this->bufeerSize = 0;
	this->mybuffer = '0';
	/* Abre el archivo para lectura - escritura binario */
	this->archivo.open(path.c_str(),
			std::ios::in | std::ios::out | std::ios::binary);
	if (!this->archivo.is_open()) {
		cout << "Error al abrir el archivo" << endl;
	}

}

bool FileReader::hasNext() {
	if (!compressMode) {
		return !this->archivo.eof() && this->archivo.is_open();
	} else {
		return (!this->archivo.eof() && this->archivo.is_open())
				|| this->buffered;
	}

}

char FileReader::readByte() {

	//Leemos de a bytes
	char charBuffer;
	this->archivo.read(&charBuffer, sizeof(char));
	return charBuffer;
}

int FileReader::readCompressedCode(int code,unsigned int tableSize) {

	unsigned int cantBisALeer =tableSize<=8?9:tableSize;;
	if (cantBisALeer < 8) {
		cantBisALeer = 8;
	}
	/*int compress[] = { 84, 69, 256, 258, 69, 82, 65, 262, 65 };
	 if(tableSize==8){
	 this->buffered=false;
	 }
	 return compress[tableSize];*/
	char charBuffer1;
	char charBuffer2;

	unsigned char byte1;
	unsigned char byte2;
	//ahora tomamos solo los primeros cantBitsALeer y el resto lo mandamos al buffer
	unsigned short mycode = 0;

	if (this->buffered) { //tengo la primer parte en el buffer
		byte1 = mybuffer;
		if (this->bufeerSize < cantBisALeer) {
			unsigned int leidos = this->bufeerSize;
			while (leidos < cantBisALeer) {
				this->archivo.read(&charBuffer2, sizeof(char));
				leidos+=8;
				byte2 = (unsigned char) charBuffer2;
				//completo el byte1
				unsigned char mask;
				mask = (byte2 >> bufeerSize);
				byte1 |= mask;
				mycode|=byte1;
				mycode<<=cantBisALeer-8;
				byte2 <<= bufeerSize;
				mybuffer = byte2;
				bufeerSize = (8 - bufeerSize);

			}
		}

	} else { //no hay nada en el buffer asi que leo tranquilo
		this->archivo.read(&charBuffer1, sizeof(char));
		byte1 = (unsigned char) charBuffer1;
		if (cantBisALeer > 8) {
			this->archivo.read(&charBuffer2, sizeof(char));
			byte2 = (unsigned char) charBuffer2;

			unsigned char byte2Aux;
			byte2Aux = byte2 >> (16 - cantBisALeer);
			mycode = (unsigned short) byte1;
			mycode <<= (cantBisALeer - 8);
			mycode |= byte2Aux;
			mybuffer = byte2 << (cantBisALeer - 8);
			bufeerSize = (cantBisALeer - 8);
			//alineo a iza
			buffered = bufeerSize > 0;
		} else {
			mycode = byte1;
		}
	}

	return mycode;
}

FileReader::~FileReader() {
	this->archivo.close();
}

